package Servlets;

import Estructuras.Principales.TarryPrincipal;
import Herramientas.FileEngine;
import Herramientas.Herramientas;
import Herramientas.MailMotor;
import TarryDAOS.ClientesDAO;
import TarryDAOS.ExistenciasProductoDAO;
import TarryDAOS.TarryItemsPedidoDAO;
import TarryDAOS.TarryPedidosDAO;
import TarryDTOS.ClientesDTO;
import TarryDTOS.TarryItemPedidoDTO;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Alan
 */
@WebServlet(name = "Almacen", urlPatterns = {"/Almacen"})
public class Almacen extends HttpServlet {

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            String action = request.getParameter("action");
            HttpSession session = request.getSession();

// TERMINAL TPV
            if (action.equals("inicio")) {
                this.principal(request, response, session);

            } else if (action.equals("detallesPedido")) {
                this.detallesPedido(request, response, session);

            } else if (action.equals("tomaDecision")) {
                this.tomaDecisionItem(request, response, session);

            } else if (action.equals("packingList")) {
                this.packingList(request, response, session);

            } else if (action.equals("filtroPedidosAlmacen")) {
                this.filtroPedidosAlmacen(request, response, session);

            } else if (action.equals("tomaDecisionItemRequest")) {
                this.tomaDecisionItemRequest(request, response, session);

            } else if (action.equals("existenciaProducto")) {
                this.existenciaProducto(request, response, session);

            } else if (action.equals("vitacoraProductoTerminado")) {
                this.vitacoraProductoTerminado(request, response, session);

            } else if (action.equals("nuevoRegistroVitacora")) {
                this.nuevoRegistroProductoTerminado(request, response, session);

            } else {
                System.out.println("ERROR AL ENTRAR A UN SERVICIO");
            }

        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    /**
     * ALAN GONZALEZ SERVICIO PRINCIPAL ALMACEN
     *
     * @param request
     * @param response
     * @param session
     */
    public void principal(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        //detallesPedido
        Herramientas herramientas = new Herramientas();
        TarryPrincipal principal = new TarryPrincipal();
        TarryPedidosDAO tarryPedidosDAO = new TarryPedidosDAO();
        principal.setPedidos(tarryPedidosDAO.todoPedidoInformado());
        session.setAttribute("tarryPrincipal", principal);
        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/almacenPrincipal.jsp");

        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(Almacen.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Almacen.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ
     *
     * @param request
     * @param response
     * @param session
     */
    public void detallesPedido(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        int idPedido = Integer.parseInt(request.getParameter("idPedido"));
        int idCliente = Integer.parseInt(request.getParameter("idCliente"));

        Herramientas herramientas = new Herramientas();
        TarryPrincipal principal = (TarryPrincipal) session.getAttribute("tarryPrincipal");
        TarryItemsPedidoDAO itemsPedidoDAO = new TarryItemsPedidoDAO();
        ClientesDAO clientesDAO = new ClientesDAO();
        ClientesDTO clientesDTO = new ClientesDTO();
        clientesDTO = clientesDAO.clientesDTO(idCliente);

        principal.setClienteDTO(clientesDTO);

        Vector vItemsPedido = itemsPedidoDAO.itemsPorPedido(idPedido);

// SEGMENTO DE EDICION DE LOS DTOS PARA HACER LA CARGA DE VALORES DE ALMACEN
        int aux = 0;
        Vector vAuxItems = new Vector();
        ExistenciasProductoDAO exitenciasProductoDAO = new ExistenciasProductoDAO();
        for (aux = 0; aux < vItemsPedido.size(); aux++) {
            TarryItemPedidoDTO item = new TarryItemPedidoDTO();
            item = (TarryItemPedidoDTO) vItemsPedido.elementAt(aux);
            item.setExistenciaActualProducto(exitenciasProductoDAO.existenciaProducto(item.getIdProducto()));
            vAuxItems.add(item);
        }
// FIN DE BUSQUEDA DE EXISTENCIAS
        principal.setIdPedidoApuntador(idPedido);
        principal.setIdClienteApuntador(idCliente);

        principal.setItemsPedido(vAuxItems);
        session.setAttribute("tarryPrincipal", principal);
        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/itemsPedidoAlmacen.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(Almacen.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Almacen.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ ESTE METODO SURTE CON EXISTENCIA O BIEN MANDA AL MODULO DE
     * PRODUCCION SOLO SE PODRA DECIDIR UNA VEZ EN SU ACCION
     *
     * @param request
     * @param response
     * @param session
     */
    public void tomaDecisionItem(HttpServletRequest request, HttpServletResponse response, HttpSession session) {

        TarryPrincipal principal = (TarryPrincipal) session.getAttribute("tarryPrincipal");

        int idItemPedido = Integer.parseInt(request.getParameter("idItem")); // CODIGO DE SEGUIMIENTO DEL PEDIDO
        int idProducto = Integer.parseInt(request.getParameter("idProducto"));     // ID ITEM 
        int idPedido = Integer.parseInt(request.getParameter("idPedido")); // CODIGO DE SEGUIMIENTO DEL PEDIDO

        principal.setIdItemPedidoApuntador(idItemPedido);
        principal.setIdItemPedidoApuntador(idPedido);
        principal.setIdProductoApuntador(idProducto);

// MODULO DE CALCULO DE EXISTENCIAS
        ExistenciasProductoDAO exitenciasProductoDAO = new ExistenciasProductoDAO();
        TarryItemsPedidoDAO itemsPedidoDAO = new TarryItemsPedidoDAO();
        int piezasSolicitadas = itemsPedidoDAO.piezasSolicitadasProducto(idPedido, idProducto);
        int existenciasProdcuto = exitenciasProductoDAO.existenciaProducto(idProducto);

// EVALUACION SI SE PUEDE SURTIT CON EXIXTENCIA O SE OPTA POR ENVIAR A PRODUCCION
        int bandera = 0;
        if (existenciasProdcuto > piezasSolicitadas) {
            bandera = 1;
        } else if (existenciasProdcuto < piezasSolicitadas) {
            bandera = 2;
        }

        session.setAttribute("banderaItem", bandera);
        session.setAttribute("tarryPrincipal", principal);

// MUESTREO DEL JSP
        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/tomaDecisionItems.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(Almacen.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Almacen.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ SERVICIO QUE RECUPERA LA OPCION SELECCIONADA
     *
     * @param request
     * @param response
     * @param session
     */
    public void tomaDecisionItemRequest(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        ExistenciasProductoDAO existenciasDAO = new ExistenciasProductoDAO();
        TarryItemsPedidoDAO itemsPedidoDAO = new TarryItemsPedidoDAO();
        TarryPedidosDAO pedidosDAO = new TarryPedidosDAO();
        TarryPrincipal principal = (TarryPrincipal) session.getAttribute("tarryPrincipal");
        int banderaOpcion = Integer.parseInt(request.getParameter("banderaOpcion")); // CODIGO DE SEGUIMIENTO DEL PEDIDO

        // VARIABLES NECESARIAS 
        int idItemPedido = principal.getIdItemPedidoApuntador(); // 
        int idProducto = principal.getIdProductoApuntador();     // EL ID DEL PRODUCTO DEL ITEM DEL PEDIDO
        int idPedido = principal.getIdPedidoApuntador();  // ID DEL PEDIDO
        int idCliente = principal.getIdClienteApuntador();
        int cajasSolicitadas = itemsPedidoDAO.piezasSolicitadasProducto(idPedido, idProducto);
        int idRegistroItemPedido = itemsPedidoDAO.idRegistroItemPedido(idPedido, idProducto); // ID DEL REGISTRO DE LA TABLA 

        switch (banderaOpcion) {
            case 1:
                // DESCUENTA LAS UNIDADES Y SE DA POR SURTIDO
                existenciasDAO.actualizaExistenciasProducto(idProducto, banderaOpcion, cajasSolicitadas);
                itemsPedidoDAO.actualizarBanderaEstadoItem(idRegistroItemPedido, banderaOpcion);
                System.out.println("el producto fue surtido");
                double nItemsPedido = itemsPedidoDAO.estadisticaPedido(idPedido, 1);
                double nItemsPedidoSurtidos = itemsPedidoDAO.estadisticaPedido(idPedido, 2);

                if (nItemsPedido == nItemsPedidoSurtidos) {
                    pedidosDAO.actualizaBanderaEstadoPedido(idPedido);
                }
                break;
            case 2:
                // ENVIA A PRODUCCION
                itemsPedidoDAO.actualizarBanderaEstadoItem(idRegistroItemPedido, banderaOpcion);
                break;
        }
        RequestDispatcher d = request.getRequestDispatcher("./Almacen?action=detallesPedido&idPedido=" + idItemPedido + "&idCliente=" + idCliente);
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(Almacen.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Almacen.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    //  PROBLEMA CON BUFFER DE SESSION AL REDIRECCIONAMIENTO MULTIMPLE SE REQUIERE DE CONTROLADOR DE REDIRECCIONAMIENTO ]
    /**
     * ALAN GONZALEZ SERVICIO PARA GENERAR UN PACKING LIST EN FORMATO PDF Y
     * ENVIARLO POR CORREO ELECTRONICO AL EMAIL DE ALMACEN
     *
     * @param request
     * @param response
     * @param session
     */
    public void packingList(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        int idPedido = Integer.parseInt(request.getParameter("idPedido"));
        MailMotor mail = new MailMotor();
        FileEngine fileEngine = new FileEngine();
        String rutaFicheroAdjunto = new String();
        RequestDispatcher a = request.getRequestDispatcher("SendingEmail.jsp");
        try {
            a.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(Almacen.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Almacen.class.getName()).log(Level.SEVERE, null, ex);
        }
        rutaFicheroAdjunto = fileEngine.packingListOrder(idPedido); // EL METODO DE PACKING LIST DEBERA DEVOLVER UN CADENA CON LA RUTA DEL ARCHIVO GENERADO
        mail.enviarMailAdjunto("malangr@outlook.es",
                " NUEVO LISTADO DE ARTICULOS",
                " SE HA SOLICITADO LISTADO DE ARTICULOS Y "
                + " DETALLES DE PEDIDO  FAVOR DE ATENDER A LA BREVEDAD", rutaFicheroAdjunto); //
    }

    /**
     * ALAN GONZALEZ | SERVICIO DE FILTADO DE ITEMS INFORMADOS
     *
     * @param request
     * @param response
     * @param session
     */
    public void filtroPedidosAlmacen(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        Vector vErrores = new Vector();
        int idPedido = 0;
        TarryPrincipal principal = new TarryPrincipal();
        TarryPedidosDAO pedidosDAO = new TarryPedidosDAO();

        if (request.getParameter("idPedido").length() > 0) {
            idPedido = Integer.parseInt(request.getParameter("idPedido"));

        } else {
            vErrores.add("ingrese un id de pedido como parametro de busqueda");
        }

        if (vErrores.size() > 0) {
            principal.setErrores(vErrores);
            principal.setPedidos(pedidosDAO.todoPedidoInformado());
            session.setAttribute("tarryPrincipal", principal);

            RequestDispatcher d = request.getRequestDispatcher("TarryJSP/almacenPrincipal.jsp");
            try {
                d.forward(request, response);
            } catch (ServletException ex) {
                Logger.getLogger(Almacen.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(Almacen.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else if (vErrores.size() == 0) {
            principal.setPedidos(pedidosDAO.pedidosInformadosFiltro(idPedido));
            session.setAttribute("tarryPrincipal", principal);
            RequestDispatcher d = request.getRequestDispatcher("TarryJSP/almacenPrincipal.jsp");
            try {
                d.forward(request, response);
            } catch (ServletException ex) {
                Logger.getLogger(Almacen.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(Almacen.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }

    /**
     * ALAN GONZALEZ EXISTENCIA DEL PRODUCTO
     *
     * @param request
     * @param response
     * @param session
     */
    public void existenciaProducto(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        TarryPrincipal principal = new TarryPrincipal();
        Vector vExistencias = new Vector();
        ExistenciasProductoDAO existenciaDAO = new ExistenciasProductoDAO();
        vExistencias = existenciaDAO.existenciasProducto();
        principal.setExistencias(vExistencias);
        session.setAttribute("tarryPrincipal", principal);
        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/AlmacenJSP/Existencias.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ SERVICIO TODOS LOS REGISTROS DE LA VITACORA DE PRODUCCION
     *
     * @param request
     * @param response
     * @param session
     */
    public void vitacoraProductoTerminado(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/AlmacenJSP/AdminEntradasProducto.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ | SERVICIO PARA GENERAR EL POP UP PARA CREAR EL LOG Y
     * CONSOLIDAR EXISTENCIAS
     *
     * @param request
     * @param response
     * @param session
     */
    public void nuevoRegistroProductoTerminado(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/AlmacenJSP/nuevoRegistroExistencias.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}
